export {}
// 因为万物皆可对象，所以object属性起不到限制
let a:object;
a={}
a = function(){}

// 一般是限制函数内包含的类型
let b:{name:string,age?:number} // 加上问号，表示属性是可选的
// b = {} 报错：类型 "{}" 中缺少属性 "name"，但类型 "{ name: string; }" 中需要该属性。

b = {name:'孙悟空'}
b = {name:'孙悟空',age:18}

//  [propName:string]:any ---> 属性名类型为string,值的类型为any
let c:{name:string , [propName:string]:any}
c = {name:'猪八戒',age:18,gender:'男'}


/* 
  设置函数结构的类型声明：
    语法：（形参：类型，形参：类型） ==> 返回值
*/
let d:(a:number,b:number) => number
d = function (n1:number , n2:number):number {
  return n1 + n2
}

// string[]表示字符串数组
let e:string[];
e = ['a','b','c','d']

// number[]表示数值数组
let f:number[];
let g:Array<number>  //另一种写法
g = [1,2,3,4]

/* 
  元祖，元素组就是固定长度的数组
    语法：[类型，类型，类型...]
*/
let h:[string , number]
h = ['hello',123]

/* 
  enum 枚举
*/
enum Gender{
  Male = 1,
  Female = 0
}

let i : {name:string,gender:Gender}
i={
  name:"孙悟空",
  gender:Gender.Male
}

// console.log(i.gender === Gender.Male);


let j : {name:string} & {age:number}
j = {name : '孙悟空' , age : 18}

type myType = 1 | 2 | 3 | 4 | 5;
let k = myType
let l = myType
let m : myType

k = 1
l = 2
m = 3